package hu.issue.web;

import hu.issue.ejb.RoleService;
import hu.issue.ejb.UserService;
import hu.issue.entity.User;
import hu.issue.exceptions.UserAlreadyRegisteredException;
import hu.issue.framework.web.controller.Inject;
import hu.issue.framework.web.controller.SimpleFormController;
import hu.issue.framework.web.validation.ErrorMessages;
import hu.issue.framework.web.validation.NotEmptyValidator;
import hu.issue.framework.web.validation.NotEqualValidator;
import hu.issue.framework.web.validation.RequestValidation;
import hu.issue.framework.web.validation.RequiredValidator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegistrationController extends SimpleFormController {
	@Inject
	private UserService userService;
	@Inject
	private RoleService roleService;

	@Override
	protected void buildValidation(final RequestValidation validation) {
		validation.addValidator(new RequiredValidator("username", "Felhasználónév kötelező"));
		validation.addValidator(new NotEmptyValidator("username", "Felhasználónév nem lehet üres"));

		validation.addValidator(new RequiredValidator("password", "Jelszó megadása kötelező"));
		validation.addValidator(new NotEmptyValidator("password", "Jelszó nem lehet üres"));

		validation.addValidator(new RequiredValidator("password_verification", "Jelszó megerősítés megadása kötelező"));
		validation.addValidator(new NotEmptyValidator("password_verification", "Jelszó megerősítése nem lehet üres"));

		validation.addValidator(new NotEqualValidator("password", "password_verification", "A jelszónak és a jelszó megerősítésnek meg kell egyeznie"));

	}

	@Override
	protected void buildModel(final HttpServletRequest request) {
		request.setAttribute("roles", this.roleService.getRoles());
	}

	@Override
	protected boolean handleSubmissionInternal(final HttpServletRequest request, final HttpServletResponse response, final ErrorMessages messages) throws Exception {
		final String userName = request.getParameter("username").trim();
		final String password = request.getParameter("password").trim();
		final String role = request.getParameter("role").trim();
		try {
			this.userService.register(new User(userName, password), role);
		} catch (final UserAlreadyRegisteredException ex) {
			messages.addMessage("Ilyen névvel már van felhasználó regisztrálva");
			return false;
		}
		return true;
	}
}
